{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Hyperparameters"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      fun: 0.3978873577297417\n",
      " hess_inv: array([[ 0.10409341, -0.0808961 ],\n",
      "       [-0.0808961 ,  0.56160622]])\n",
      "      jac: array([ 3.57627869e-07, -1.19209290e-07])\n",
      "  message: 'Optimization terminated successfully.'\n",
      "     nfev: 36\n",
      "      nit: 5\n",
      "     njev: 9\n",
      "   status: 0\n",
      "  success: True\n",
      "        x: array([3.14159268, 2.27499994])\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "\n",
    "def branin(x):\n",
    "\n",
    "    # Branin function has 2 dimensions and it has 3 global mimima\n",
    "    x1 = x[0]\n",
    "    x2 = x[1]\n",
    "\n",
    "    # Global minimum is f(x*)=0.397887 at points (-pi, 12.275), (pi,2.275) and (9.42478, 2.475)\n",
    "\n",
    "    # Recommended values of a, b, c, r, s and t for Branin function\n",
    "    a = 1\n",
    "    b = 5.1 / (4 * np.pi**2)\n",
    "    c = 5. / np.pi\n",
    "    r = 6.\n",
    "    s = 10.\n",
    "    t = 1 / (8 * np.pi)\n",
    "\n",
    "    # Calculating separate parts of the function first for verbosity\n",
    "    p1 = a * (x2 - (b * x1**2) + (c * x1) - r)**2\n",
    "    p2 = s * (1-t) * np.cos(x1)\n",
    "    p3 = s\n",
    "\n",
    "    # Calculating result\n",
    "    ret = p1 + p2 + p3\n",
    "\n",
    "    return ret\n",
    "\n",
    "# minimize function from scipy.optimize will minimize a scalar function with one or more variables\n",
    "from scipy.optimize import minimize\n",
    "\n",
    "x = [5.6, 3.2]\n",
    "\n",
    "res = minimize(branin, x)\n",
    "\n",
    "print(res)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'C': 1.0,\n",
       " 'class_weight': None,\n",
       " 'dual': False,\n",
       " 'fit_intercept': True,\n",
       " 'intercept_scaling': 1,\n",
       " 'max_iter': 100,\n",
       " 'multi_class': 'ovr',\n",
       " 'n_jobs': 1,\n",
       " 'penalty': 'l2',\n",
       " 'random_state': None,\n",
       " 'solver': 'liblinear',\n",
       " 'tol': 0.0001,\n",
       " 'verbose': 0,\n",
       " 'warm_start': False}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "log_reg = LogisticRegression()\n",
    "log_reg.get_params()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### GridSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=5, error_score='raise',\n",
       "       estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "       fit_params=None, iid=True, n_jobs=1,\n",
       "       param_grid={'C': [0.001, 0.01, 0.1, 1, 10, 20, 50, 100], 'penalty': ['l1', 'l2']},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score=True,\n",
       "       scoring=None, verbose=0)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "log_reg = LogisticRegression()\n",
    "\n",
    "# Hyperparameters\n",
    "param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 20, 50, 100],\n",
    "                'penalty': ['l1', 'l2']}\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "n_folds = 5\n",
    "estimator = GridSearchCV(log_reg,param_grid, cv=n_folds)\n",
    "\n",
    "from sklearn import datasets\n",
    "iris = datasets.load_iris()\n",
    "X = iris.data\n",
    "Y = iris.target\n",
    "\n",
    "estimator.fit(X, Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=10, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l1', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "estimator.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.98"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "estimator.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.00050259, 0.00037079, 0.00036898, 0.00040231, 0.00126853,\n",
       "        0.00043383, 0.0067677 , 0.00050964, 0.00959454, 0.00059609,\n",
       "        0.00928202, 0.00062227, 0.01087003, 0.00067725, 0.01243005,\n",
       "        0.00072727]),\n",
       " 'mean_score_time': array([0.00016618, 0.00015163, 0.0001761 , 0.00015354, 0.00015359,\n",
       "        0.00015073, 0.00019321, 0.00014992, 0.00017753, 0.0001574 ,\n",
       "        0.00020618, 0.00015855, 0.00022583, 0.00016518, 0.00024314,\n",
       "        0.00022717]),\n",
       " 'mean_test_score': array([0.33333333, 0.40666667, 0.33333333, 0.66666667, 0.77333333,\n",
       "        0.82      , 0.96      , 0.96      , 0.98      , 0.96666667,\n",
       "        0.96666667, 0.96666667, 0.96666667, 0.97333333, 0.96      ,\n",
       "        0.98      ]),\n",
       " 'mean_train_score': array([0.33333333, 0.40166667, 0.33333333, 0.66666667, 0.775     ,\n",
       "        0.83166667, 0.96333333, 0.96333333, 0.97333333, 0.97333333,\n",
       "        0.97333333, 0.97666667, 0.975     , 0.97833333, 0.975     ,\n",
       "        0.98      ]),\n",
       " 'param_C': masked_array(data=[0.001, 0.001, 0.01, 0.01, 0.1, 0.1, 1, 1, 10, 10, 20,\n",
       "                    20, 50, 50, 100, 100],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l2', 'l1', 'l2', 'l1', 'l2', 'l1', 'l2'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 0.001, 'penalty': 'l1'},\n",
       "  {'C': 0.001, 'penalty': 'l2'},\n",
       "  {'C': 0.01, 'penalty': 'l1'},\n",
       "  {'C': 0.01, 'penalty': 'l2'},\n",
       "  {'C': 0.1, 'penalty': 'l1'},\n",
       "  {'C': 0.1, 'penalty': 'l2'},\n",
       "  {'C': 1, 'penalty': 'l1'},\n",
       "  {'C': 1, 'penalty': 'l2'},\n",
       "  {'C': 10, 'penalty': 'l1'},\n",
       "  {'C': 10, 'penalty': 'l2'},\n",
       "  {'C': 20, 'penalty': 'l1'},\n",
       "  {'C': 20, 'penalty': 'l2'},\n",
       "  {'C': 50, 'penalty': 'l1'},\n",
       "  {'C': 50, 'penalty': 'l2'},\n",
       "  {'C': 100, 'penalty': 'l1'},\n",
       "  {'C': 100, 'penalty': 'l2'}],\n",
       " 'rank_test_score': array([15, 14, 15, 13, 12, 11,  8,  8,  1,  4,  4,  4,  4,  3,  8,  1],\n",
       "       dtype=int32),\n",
       " 'split0_test_score': array([0.33333333, 0.36666667, 0.33333333, 0.66666667, 0.7       ,\n",
       "        0.76666667, 1.        , 1.        , 1.        , 1.        ,\n",
       "        1.        , 1.        , 1.        , 1.        , 0.96666667,\n",
       "        1.        ]),\n",
       " 'split0_train_score': array([0.33333333, 0.41666667, 0.33333333, 0.66666667, 0.775     ,\n",
       "        0.825     , 0.95      , 0.95      , 0.95      , 0.96666667,\n",
       "        0.95      , 0.975     , 0.95833333, 0.975     , 0.95833333,\n",
       "        0.975     ]),\n",
       " 'split1_test_score': array([0.33333333, 0.46666667, 0.33333333, 0.66666667, 0.8       ,\n",
       "        0.86666667, 0.96666667, 0.96666667, 1.        , 1.        ,\n",
       "        0.96666667, 1.        , 0.96666667, 1.        , 0.96666667,\n",
       "        1.        ]),\n",
       " 'split1_train_score': array([0.33333333, 0.35833333, 0.33333333, 0.66666667, 0.775     ,\n",
       "        0.825     , 0.95833333, 0.96666667, 0.975     , 0.96666667,\n",
       "        0.975     , 0.975     , 0.975     , 0.975     , 0.975     ,\n",
       "        0.975     ]),\n",
       " 'split2_test_score': array([0.33333333, 0.36666667, 0.33333333, 0.66666667, 0.8       ,\n",
       "        0.83333333, 0.93333333, 0.93333333, 0.96666667, 0.93333333,\n",
       "        0.93333333, 0.93333333, 0.93333333, 0.93333333, 0.93333333,\n",
       "        0.96666667]),\n",
       " 'split2_train_score': array([0.33333333, 0.41666667, 0.33333333, 0.66666667, 0.76666667,\n",
       "        0.83333333, 0.96666667, 0.96666667, 0.975     , 0.975     ,\n",
       "        0.975     , 0.98333333, 0.975     , 0.98333333, 0.975     ,\n",
       "        0.98333333]),\n",
       " 'split3_test_score': array([0.33333333, 0.46666667, 0.33333333, 0.66666667, 0.8       ,\n",
       "        0.83333333, 0.9       , 0.9       , 0.93333333, 0.9       ,\n",
       "        0.93333333, 0.9       , 0.93333333, 0.93333333, 0.93333333,\n",
       "        0.93333333]),\n",
       " 'split3_train_score': array([0.33333333, 0.39166667, 0.33333333, 0.66666667, 0.775     ,\n",
       "        0.84166667, 0.975     , 0.975     , 0.99166667, 0.98333333,\n",
       "        0.99166667, 0.98333333, 0.99166667, 0.98333333, 0.99166667,\n",
       "        0.99166667]),\n",
       " 'split4_test_score': array([0.33333333, 0.36666667, 0.33333333, 0.66666667, 0.76666667,\n",
       "        0.8       , 1.        , 1.        , 1.        , 1.        ,\n",
       "        1.        , 1.        , 1.        , 1.        , 1.        ,\n",
       "        1.        ]),\n",
       " 'split4_train_score': array([0.33333333, 0.425     , 0.33333333, 0.66666667, 0.78333333,\n",
       "        0.83333333, 0.96666667, 0.95833333, 0.975     , 0.975     ,\n",
       "        0.975     , 0.96666667, 0.975     , 0.975     , 0.975     ,\n",
       "        0.975     ]),\n",
       " 'std_fit_time': array([3.38114701e-04, 7.00058012e-06, 3.20775696e-05, 1.08616346e-05,\n",
       "        1.88878178e-04, 7.51620006e-06, 7.73877568e-04, 8.10707312e-06,\n",
       "        1.94658867e-03, 4.84379250e-05, 3.07941014e-03, 2.94459976e-05,\n",
       "        3.62261027e-03, 7.70400638e-05, 3.49942121e-03, 5.43787989e-05]),\n",
       " 'std_score_time': array([2.47675481e-05, 1.07684992e-06, 2.10352755e-05, 3.35823381e-06,\n",
       "        3.40996917e-06, 5.91739352e-07, 6.25416243e-05, 9.58430826e-07,\n",
       "        2.54747100e-05, 1.17899374e-05, 4.68766094e-05, 6.31876708e-06,\n",
       "        2.64794505e-05, 2.03092329e-05, 2.99366404e-05, 1.32537692e-04]),\n",
       " 'std_test_score': array([0.        , 0.04898979, 0.        , 0.        , 0.03887301,\n",
       "        0.03399346, 0.03887301, 0.03887301, 0.02666667, 0.0421637 ,\n",
       "        0.02981424, 0.0421637 , 0.02981424, 0.03265986, 0.02494438,\n",
       "        0.02666667]),\n",
       " 'std_train_score': array([0.        , 0.02438123, 0.        , 0.        , 0.00527046,\n",
       "        0.0062361 , 0.00849837, 0.00849837, 0.01333333, 0.0062361 ,\n",
       "        0.01333333, 0.0062361 , 0.01054093, 0.00408248, 0.01054093,\n",
       "        0.00666667])}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "estimator.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "### RandomizedSearchCV"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "RandomizedSearchCV(cv=5, error_score='raise',\n",
       "          estimator=LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False),\n",
       "          fit_params=None, iid=True, n_iter=20, n_jobs=1,\n",
       "          param_distributions={'C': <scipy.stats._distn_infrastructure.rv_frozen object at 0x11ea28c88>, 'penalty': ['l1', 'l2']},\n",
       "          pre_dispatch='2*n_jobs', random_state=None, refit=True,\n",
       "          return_train_score=True, scoring=None, verbose=0)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import RandomizedSearchCV\n",
    "from scipy.stats import randint as sp_randint\n",
    "\n",
    "# Hyperparameters\n",
    "param_grid = {'C': sp_randint(1, 100),\n",
    "                'penalty': ['l1', 'l2']}\n",
    "\n",
    "n_iter_search = 20\n",
    "n_folds = 5\n",
    "estimator = RandomizedSearchCV(log_reg, param_distributions=param_grid, n_iter=n_iter_search, cv=n_folds)\n",
    "\n",
    "estimator.fit(X, Y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LogisticRegression(C=97, class_weight=None, dual=False, fit_intercept=True,\n",
       "          intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
       "          penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
       "          verbose=0, warm_start=False)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "estimator.best_estimator_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.98"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "estimator.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([0.00113101, 0.00066476, 0.00064368, 0.00072603, 0.00953279,\n",
       "        0.01018925, 0.01146622, 0.01120405, 0.01113758, 0.00073571,\n",
       "        0.00065789, 0.00071578, 0.01223884, 0.01002998, 0.00064077,\n",
       "        0.01223807, 0.000702  , 0.01238017, 0.01156883, 0.01123042]),\n",
       " 'mean_score_time': array([0.00026402, 0.0001575 , 0.00016494, 0.00016799, 0.00026145,\n",
       "        0.00020342, 0.00023904, 0.00022388, 0.00025783, 0.00017829,\n",
       "        0.00015912, 0.00021124, 0.00025773, 0.00021753, 0.00015645,\n",
       "        0.00031519, 0.00019603, 0.00028038, 0.00027213, 0.00037408]),\n",
       " 'mean_test_score': array([0.97333333, 0.98      , 0.97333333, 0.97333333, 0.96666667,\n",
       "        0.96666667, 0.96666667, 0.96666667, 0.96666667, 0.97333333,\n",
       "        0.97333333, 0.97333333, 0.96666667, 0.96666667, 0.97333333,\n",
       "        0.96666667, 0.98      , 0.96666667, 0.96666667, 0.98      ]),\n",
       " 'mean_train_score': array([0.97833333, 0.98      , 0.97833333, 0.97833333, 0.975     ,\n",
       "        0.975     , 0.975     , 0.975     , 0.975     , 0.97833333,\n",
       "        0.97833333, 0.97833333, 0.975     , 0.97333333, 0.97833333,\n",
       "        0.975     , 0.98      , 0.975     , 0.975     , 0.97333333]),\n",
       " 'param_C': masked_array(data=[32, 97, 64, 68, 76, 57, 88, 49, 30, 58, 61, 35, 90, 26,\n",
       "                    36, 98, 93, 75, 54, 7],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_penalty': masked_array(data=['l2', 'l2', 'l2', 'l2', 'l1', 'l1', 'l1', 'l1', 'l1',\n",
       "                    'l2', 'l2', 'l2', 'l1', 'l1', 'l2', 'l1', 'l2', 'l1',\n",
       "                    'l1', 'l1'],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'C': 32, 'penalty': 'l2'},\n",
       "  {'C': 97, 'penalty': 'l2'},\n",
       "  {'C': 64, 'penalty': 'l2'},\n",
       "  {'C': 68, 'penalty': 'l2'},\n",
       "  {'C': 76, 'penalty': 'l1'},\n",
       "  {'C': 57, 'penalty': 'l1'},\n",
       "  {'C': 88, 'penalty': 'l1'},\n",
       "  {'C': 49, 'penalty': 'l1'},\n",
       "  {'C': 30, 'penalty': 'l1'},\n",
       "  {'C': 58, 'penalty': 'l2'},\n",
       "  {'C': 61, 'penalty': 'l2'},\n",
       "  {'C': 35, 'penalty': 'l2'},\n",
       "  {'C': 90, 'penalty': 'l1'},\n",
       "  {'C': 26, 'penalty': 'l1'},\n",
       "  {'C': 36, 'penalty': 'l2'},\n",
       "  {'C': 98, 'penalty': 'l1'},\n",
       "  {'C': 93, 'penalty': 'l2'},\n",
       "  {'C': 75, 'penalty': 'l1'},\n",
       "  {'C': 54, 'penalty': 'l1'},\n",
       "  {'C': 7, 'penalty': 'l1'}],\n",
       " 'rank_test_score': array([ 4,  1,  4,  4, 11, 11, 11, 11, 11,  4,  4,  4, 11, 11,  4, 11,  1,\n",
       "        11, 11,  1], dtype=int32),\n",
       " 'split0_test_score': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "        1., 1., 1.]),\n",
       " 'split0_train_score': array([0.975     , 0.975     , 0.975     , 0.975     , 0.95833333,\n",
       "        0.95833333, 0.95833333, 0.95833333, 0.95833333, 0.975     ,\n",
       "        0.975     , 0.975     , 0.95833333, 0.95      , 0.975     ,\n",
       "        0.95833333, 0.975     , 0.95833333, 0.95833333, 0.95833333]),\n",
       " 'split1_test_score': array([1.        , 1.        , 1.        , 1.        , 0.96666667,\n",
       "        0.96666667, 0.96666667, 0.96666667, 0.96666667, 1.        ,\n",
       "        1.        , 1.        , 0.96666667, 0.96666667, 1.        ,\n",
       "        0.96666667, 1.        , 0.96666667, 0.96666667, 1.        ]),\n",
       " 'split1_train_score': array([0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975,\n",
       "        0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975,\n",
       "        0.975, 0.975]),\n",
       " 'split2_test_score': array([0.93333333, 0.96666667, 0.93333333, 0.93333333, 0.93333333,\n",
       "        0.93333333, 0.93333333, 0.93333333, 0.93333333, 0.93333333,\n",
       "        0.93333333, 0.93333333, 0.93333333, 0.93333333, 0.93333333,\n",
       "        0.93333333, 0.96666667, 0.93333333, 0.93333333, 0.96666667]),\n",
       " 'split2_train_score': array([0.98333333, 0.98333333, 0.98333333, 0.98333333, 0.975     ,\n",
       "        0.975     , 0.975     , 0.975     , 0.975     , 0.98333333,\n",
       "        0.98333333, 0.98333333, 0.975     , 0.975     , 0.98333333,\n",
       "        0.975     , 0.98333333, 0.975     , 0.975     , 0.975     ]),\n",
       " 'split3_test_score': array([0.93333333, 0.93333333, 0.93333333, 0.93333333, 0.93333333,\n",
       "        0.93333333, 0.93333333, 0.93333333, 0.93333333, 0.93333333,\n",
       "        0.93333333, 0.93333333, 0.93333333, 0.93333333, 0.93333333,\n",
       "        0.93333333, 0.93333333, 0.93333333, 0.93333333, 0.93333333]),\n",
       " 'split3_train_score': array([0.98333333, 0.99166667, 0.98333333, 0.98333333, 0.99166667,\n",
       "        0.99166667, 0.99166667, 0.99166667, 0.99166667, 0.98333333,\n",
       "        0.98333333, 0.98333333, 0.99166667, 0.99166667, 0.98333333,\n",
       "        0.99166667, 0.99166667, 0.99166667, 0.99166667, 0.98333333]),\n",
       " 'split4_test_score': array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,\n",
       "        1., 1., 1.]),\n",
       " 'split4_train_score': array([0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975,\n",
       "        0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975, 0.975,\n",
       "        0.975, 0.975]),\n",
       " 'std_fit_time': array([4.75300635e-04, 2.84793563e-05, 1.28466692e-05, 8.38511601e-05,\n",
       "        1.03754588e-03, 2.62815005e-03, 2.19075458e-03, 2.79198934e-03,\n",
       "        2.79977268e-03, 1.48818990e-04, 6.98625185e-05, 7.53024465e-05,\n",
       "        2.68306610e-03, 3.42507811e-03, 5.92257089e-05, 1.94117615e-03,\n",
       "        1.04105860e-04, 2.75807540e-03, 2.32968802e-03, 3.19258889e-03]),\n",
       " 'std_score_time': array([1.04832256e-04, 2.38227768e-06, 1.14851454e-05, 1.13989017e-05,\n",
       "        2.05359100e-05, 3.02464391e-05, 1.69613330e-05, 3.47630313e-05,\n",
       "        3.41475338e-05, 3.41444707e-05, 1.29806601e-05, 7.08970428e-05,\n",
       "        5.45737992e-05, 5.94525495e-05, 7.48710264e-06, 6.29620088e-05,\n",
       "        5.02094810e-05, 2.14311648e-05, 3.67197432e-05, 2.02655848e-04]),\n",
       " 'std_test_score': array([0.03265986, 0.02666667, 0.03265986, 0.03265986, 0.02981424,\n",
       "        0.02981424, 0.02981424, 0.02981424, 0.02981424, 0.03265986,\n",
       "        0.03265986, 0.03265986, 0.02981424, 0.02981424, 0.03265986,\n",
       "        0.02981424, 0.02666667, 0.02981424, 0.02981424, 0.02666667]),\n",
       " 'std_train_score': array([0.00408248, 0.00666667, 0.00408248, 0.00408248, 0.01054093,\n",
       "        0.01054093, 0.01054093, 0.01054093, 0.01054093, 0.00408248,\n",
       "        0.00408248, 0.00408248, 0.01054093, 0.01333333, 0.00408248,\n",
       "        0.01054093, 0.00666667, 0.01054093, 0.01054093, 0.00816497])}"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "estimator.cv_results_"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Results in pandas"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean_fit_time</th>\n",
       "      <th>mean_score_time</th>\n",
       "      <th>mean_test_score</th>\n",
       "      <th>mean_train_score</th>\n",
       "      <th>param_C</th>\n",
       "      <th>param_penalty</th>\n",
       "      <th>params</th>\n",
       "      <th>rank_test_score</th>\n",
       "      <th>split0_test_score</th>\n",
       "      <th>split0_train_score</th>\n",
       "      <th>...</th>\n",
       "      <th>split2_test_score</th>\n",
       "      <th>split2_train_score</th>\n",
       "      <th>split3_test_score</th>\n",
       "      <th>split3_train_score</th>\n",
       "      <th>split4_test_score</th>\n",
       "      <th>split4_train_score</th>\n",
       "      <th>std_fit_time</th>\n",
       "      <th>std_score_time</th>\n",
       "      <th>std_test_score</th>\n",
       "      <th>std_train_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.001131</td>\n",
       "      <td>0.000264</td>\n",
       "      <td>0.973333</td>\n",
       "      <td>0.978333</td>\n",
       "      <td>32</td>\n",
       "      <td>l2</td>\n",
       "      <td>{'C': 32, 'penalty': 'l2'}</td>\n",
       "      <td>4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975</td>\n",
       "      <td>0.000475</td>\n",
       "      <td>0.000105</td>\n",
       "      <td>0.032660</td>\n",
       "      <td>0.004082</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.000665</td>\n",
       "      <td>0.000157</td>\n",
       "      <td>0.980000</td>\n",
       "      <td>0.980000</td>\n",
       "      <td>97</td>\n",
       "      <td>l2</td>\n",
       "      <td>{'C': 97, 'penalty': 'l2'}</td>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.991667</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975</td>\n",
       "      <td>0.000028</td>\n",
       "      <td>0.000002</td>\n",
       "      <td>0.026667</td>\n",
       "      <td>0.006667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0.000644</td>\n",
       "      <td>0.000165</td>\n",
       "      <td>0.973333</td>\n",
       "      <td>0.978333</td>\n",
       "      <td>64</td>\n",
       "      <td>l2</td>\n",
       "      <td>{'C': 64, 'penalty': 'l2'}</td>\n",
       "      <td>4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975</td>\n",
       "      <td>0.000013</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.032660</td>\n",
       "      <td>0.004082</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0.000726</td>\n",
       "      <td>0.000168</td>\n",
       "      <td>0.973333</td>\n",
       "      <td>0.978333</td>\n",
       "      <td>68</td>\n",
       "      <td>l2</td>\n",
       "      <td>{'C': 68, 'penalty': 'l2'}</td>\n",
       "      <td>4</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975</td>\n",
       "      <td>0.000084</td>\n",
       "      <td>0.000011</td>\n",
       "      <td>0.032660</td>\n",
       "      <td>0.004082</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0.009533</td>\n",
       "      <td>0.000261</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>76</td>\n",
       "      <td>l1</td>\n",
       "      <td>{'C': 76, 'penalty': 'l1'}</td>\n",
       "      <td>11</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.958333</td>\n",
       "      <td>...</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.991667</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975</td>\n",
       "      <td>0.001038</td>\n",
       "      <td>0.000021</td>\n",
       "      <td>0.029814</td>\n",
       "      <td>0.010541</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 22 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   mean_fit_time  mean_score_time  mean_test_score  mean_train_score param_C  \\\n",
       "0       0.001131         0.000264         0.973333          0.978333      32   \n",
       "1       0.000665         0.000157         0.980000          0.980000      97   \n",
       "2       0.000644         0.000165         0.973333          0.978333      64   \n",
       "3       0.000726         0.000168         0.973333          0.978333      68   \n",
       "4       0.009533         0.000261         0.966667          0.975000      76   \n",
       "\n",
       "  param_penalty                      params  rank_test_score  \\\n",
       "0            l2  {'C': 32, 'penalty': 'l2'}                4   \n",
       "1            l2  {'C': 97, 'penalty': 'l2'}                1   \n",
       "2            l2  {'C': 64, 'penalty': 'l2'}                4   \n",
       "3            l2  {'C': 68, 'penalty': 'l2'}                4   \n",
       "4            l1  {'C': 76, 'penalty': 'l1'}               11   \n",
       "\n",
       "   split0_test_score  split0_train_score       ...         split2_test_score  \\\n",
       "0                1.0            0.975000       ...                  0.933333   \n",
       "1                1.0            0.975000       ...                  0.966667   \n",
       "2                1.0            0.975000       ...                  0.933333   \n",
       "3                1.0            0.975000       ...                  0.933333   \n",
       "4                1.0            0.958333       ...                  0.933333   \n",
       "\n",
       "   split2_train_score  split3_test_score  split3_train_score  \\\n",
       "0            0.983333           0.933333            0.983333   \n",
       "1            0.983333           0.933333            0.991667   \n",
       "2            0.983333           0.933333            0.983333   \n",
       "3            0.983333           0.933333            0.983333   \n",
       "4            0.975000           0.933333            0.991667   \n",
       "\n",
       "   split4_test_score  split4_train_score  std_fit_time  std_score_time  \\\n",
       "0                1.0               0.975      0.000475        0.000105   \n",
       "1                1.0               0.975      0.000028        0.000002   \n",
       "2                1.0               0.975      0.000013        0.000011   \n",
       "3                1.0               0.975      0.000084        0.000011   \n",
       "4                1.0               0.975      0.001038        0.000021   \n",
       "\n",
       "   std_test_score  std_train_score  \n",
       "0        0.032660         0.004082  \n",
       "1        0.026667         0.006667  \n",
       "2        0.032660         0.004082  \n",
       "3        0.032660         0.004082  \n",
       "4        0.029814         0.010541  \n",
       "\n",
       "[5 rows x 22 columns]"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.DataFrame(estimator.cv_results_)\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mean_fit_time</th>\n",
       "      <th>mean_score_time</th>\n",
       "      <th>mean_test_score</th>\n",
       "      <th>mean_train_score</th>\n",
       "      <th>param_C</th>\n",
       "      <th>param_penalty</th>\n",
       "      <th>params</th>\n",
       "      <th>rank_test_score</th>\n",
       "      <th>split0_test_score</th>\n",
       "      <th>split0_train_score</th>\n",
       "      <th>...</th>\n",
       "      <th>split2_test_score</th>\n",
       "      <th>split2_train_score</th>\n",
       "      <th>split3_test_score</th>\n",
       "      <th>split3_train_score</th>\n",
       "      <th>split4_test_score</th>\n",
       "      <th>split4_train_score</th>\n",
       "      <th>std_fit_time</th>\n",
       "      <th>std_score_time</th>\n",
       "      <th>std_test_score</th>\n",
       "      <th>std_train_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.000665</td>\n",
       "      <td>0.000157</td>\n",
       "      <td>0.98</td>\n",
       "      <td>0.980000</td>\n",
       "      <td>97</td>\n",
       "      <td>l2</td>\n",
       "      <td>{'C': 97, 'penalty': 'l2'}</td>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.991667</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975</td>\n",
       "      <td>0.000028</td>\n",
       "      <td>0.000002</td>\n",
       "      <td>0.026667</td>\n",
       "      <td>0.006667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>0.000702</td>\n",
       "      <td>0.000196</td>\n",
       "      <td>0.98</td>\n",
       "      <td>0.980000</td>\n",
       "      <td>93</td>\n",
       "      <td>l2</td>\n",
       "      <td>{'C': 93, 'penalty': 'l2'}</td>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>...</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.991667</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975</td>\n",
       "      <td>0.000104</td>\n",
       "      <td>0.000050</td>\n",
       "      <td>0.026667</td>\n",
       "      <td>0.006667</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>0.011230</td>\n",
       "      <td>0.000374</td>\n",
       "      <td>0.98</td>\n",
       "      <td>0.973333</td>\n",
       "      <td>7</td>\n",
       "      <td>l1</td>\n",
       "      <td>{'C': 7, 'penalty': 'l1'}</td>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.958333</td>\n",
       "      <td>...</td>\n",
       "      <td>0.966667</td>\n",
       "      <td>0.975000</td>\n",
       "      <td>0.933333</td>\n",
       "      <td>0.983333</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0.975</td>\n",
       "      <td>0.003193</td>\n",
       "      <td>0.000203</td>\n",
       "      <td>0.026667</td>\n",
       "      <td>0.008165</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>3 rows × 22 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "    mean_fit_time  mean_score_time  mean_test_score  mean_train_score param_C  \\\n",
       "1        0.000665         0.000157             0.98          0.980000      97   \n",
       "16       0.000702         0.000196             0.98          0.980000      93   \n",
       "19       0.011230         0.000374             0.98          0.973333       7   \n",
       "\n",
       "   param_penalty                      params  rank_test_score  \\\n",
       "1             l2  {'C': 97, 'penalty': 'l2'}                1   \n",
       "16            l2  {'C': 93, 'penalty': 'l2'}                1   \n",
       "19            l1   {'C': 7, 'penalty': 'l1'}                1   \n",
       "\n",
       "    split0_test_score  split0_train_score       ...         split2_test_score  \\\n",
       "1                 1.0            0.975000       ...                  0.966667   \n",
       "16                1.0            0.975000       ...                  0.966667   \n",
       "19                1.0            0.958333       ...                  0.966667   \n",
       "\n",
       "    split2_train_score  split3_test_score  split3_train_score  \\\n",
       "1             0.983333           0.933333            0.991667   \n",
       "16            0.983333           0.933333            0.991667   \n",
       "19            0.975000           0.933333            0.983333   \n",
       "\n",
       "    split4_test_score  split4_train_score  std_fit_time  std_score_time  \\\n",
       "1                 1.0               0.975      0.000028        0.000002   \n",
       "16                1.0               0.975      0.000104        0.000050   \n",
       "19                1.0               0.975      0.003193        0.000203   \n",
       "\n",
       "    std_test_score  std_train_score  \n",
       "1         0.026667         0.006667  \n",
       "16        0.026667         0.006667  \n",
       "19        0.026667         0.008165  \n",
       "\n",
       "[3 rows x 22 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[df['mean_test_score'] == df['mean_test_score'].max()]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Warm-start"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time: 0.0013301372528076172\n",
      "Time: 0.0016217231750488281\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "log_reg = LogisticRegression(C=10, tol=0.00001)\n",
    "\n",
    "from sklearn import datasets\n",
    "iris = datasets.load_iris()\n",
    "X = iris.data\n",
    "Y = iris.target\n",
    "\n",
    "from time import time\n",
    "start = time()\n",
    "log_reg.fit(X, Y)\n",
    "end = time()\n",
    "print(\"Time: {}\".format(end - start))\n",
    "# Time: 0.0009272098541259766\n",
    "\n",
    "log_reg.set_params(C=20)\n",
    "# LogisticRegression(C=100, class_weight=None, dual=False, fit_intercept=True,\n",
    "# intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1,\n",
    "# penalty='l2', random_state=None, solver='liblinear', tol=0.0001,\n",
    "# verbose=0, warm_start=False)\n",
    "\n",
    "start = time()\n",
    "log_reg.fit(X, Y)\n",
    "end = time()\n",
    "print(\"Time: {}\".format(end - start))\n",
    "# Time: 0.0012941360473632812"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Time: 0.04732203483581543\n",
      "Time: 0.020308971405029297\n"
     ]
    }
   ],
   "source": [
    "log_reg = LogisticRegression(C=10, solver='sag', warm_start=True, max_iter=10000)\n",
    "\n",
    "start = time()\n",
    "log_reg.fit(X, Y)\n",
    "end = time()\n",
    "print(\"Time: {}\".format(end - start))\n",
    "# Time: 0.043714046478271484\n",
    "\n",
    "log_reg.set_params(C=20)\n",
    "\n",
    "start = time()\n",
    "log_reg.fit(X, Y)\n",
    "end = time()\n",
    "print(\"Time: {}\".format(end - start))\n",
    "# Time: 0.020781755447387695"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Bayesian-based hyperparameter tuning"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3.07419145 2.39022223] 0.4235428462537083\n"
     ]
    }
   ],
   "source": [
    "from smac.facade.func_facade import fmin_smac\n",
    "\n",
    "x, cost, _ = fmin_smac(func=branin, # function\n",
    "                           x0=[3.2, 4.5], # default configuration\n",
    "                           bounds=[(-5, 10), (0, 15)], # limits\n",
    "                           maxfun=500, # maximum number of evaluations\n",
    "                           rng=3) # random seed\n",
    "\n",
    "\n",
    "print(x, cost)\n",
    "# [3.07419145 2.39022223] 0.4235428462537083"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### An example system"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Importing necessary libraries\n",
    "import numpy as np\n",
    "from xgboost import XGBClassifier\n",
    "from sklearn import datasets\n",
    "from sklearn.model_selection import cross_val_score\n",
    "\n",
    "# Importomg ConfigSpace and different types of parameters\n",
    "from smac.configspace import ConfigurationSpace\n",
    "from ConfigSpace.hyperparameters import CategoricalHyperparameter, \\\n",
    "    UniformFloatHyperparameter, UniformIntegerHyperparameter\n",
    "from ConfigSpace.conditions import InCondition\n",
    "\n",
    "# Import SMAC-utilities\n",
    "from smac.tae.execute_func import ExecuteTAFuncDict\n",
    "from smac.scenario.scenario import Scenario\n",
    "from smac.facade.smac_facade import SMAC\n",
    "\n",
    "# Creating configuration space.\n",
    "# Configuration space will hold all of your hyperparameters\n",
    "cs = ConfigurationSpace()\n",
    "\n",
    "# Defining hyperparameters and range of values that they can take\n",
    "learning_rate = UniformFloatHyperparameter(\"learning_rate\", 0.001, 0.1, default_value=0.1)\n",
    "n_estimators = UniformIntegerHyperparameter(\"n_estimators\", 100, 200, default_value=100)\n",
    "\n",
    "# Adding hyperparameters to configuration space\n",
    "cs.add_hyperparameters([learning_rate, n_estimators])\n",
    "\n",
    "# Loading data set\n",
    "wbc_dataset = datasets.load_breast_cancer()\n",
    "\n",
    "# Creating function to cross validate XGBoost classifier given the configuration space\n",
    "def xgboost_from_cfg(cfg):\n",
    "    \"\"\" Creates a XGBoost based on a configuration and evaluates it on the\n",
    "    Wisconsin Breast Cancer-dataset using cross-validation.\n",
    "\n",
    "    Parameters:\n",
    "    -----------\n",
    "    cfg: Configuration (ConfigSpace.ConfigurationSpace.Configuration)\n",
    "        Configuration containing the parameters.\n",
    "        Configurations are indexable!\n",
    "    Returns:\n",
    "    --------\n",
    "    A crossvalidated mean score for the svm on the loaded data-set.\n",
    "    \"\"\"\n",
    "\n",
    "    cfg = {k: cfg[k] for k in cfg if cfg[k]}\n",
    "\n",
    "    clf = XGBClassifier(**cfg, eval_metric='auc', early_stopping_rounds=50, random_state=42)\n",
    "\n",
    "    scores = cross_val_score(clf, wbc_dataset.data, wbc_dataset.target, cv=5)\n",
    "\n",
    "    return 1 - np.mean(scores) # Minimize!\n",
    "\n",
    "\n",
    "# Creating Scenario object\n",
    "scenario = Scenario({\"run_obj\": \"quality\",\n",
    "                     \"runcount-limit\": 200, # maximum function evaluations\n",
    "                     \"cs\": cs, # configuration space\n",
    "                     \"deterministic\": \"true\"\n",
    "                     })\n",
    "\n",
    "\n",
    "\n",
    "# SMAC object handles bayesian optimization loop\n",
    "print(\"Please wait until optimization is finished\")\n",
    "smac = SMAC(scenario=scenario, rng=np.random.RandomState(42),\n",
    "        tae_runner=xgboost_from_cfg)\n",
    "\n",
    "incumbent = smac.optimize()\n",
    "\n",
    "# Let's see the best performing hyperparameter values\n",
    "print(incumbent)\n",
    "# Configuration:\n",
    "# learning_rate, Value: 0.08815217130807515\n",
    "# n_estimators, Value: 196\n",
    "\n",
    "# You can see the errpr rate of optimized hyperparameters\n",
    "inc_value = xgboost_from_cfg(incumbent)\n",
    "\n",
    "print(\"Optimized Value: %.2f\" % (inc_value))\n",
    "# 0.02"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "200 200 200\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABBwAAAJCCAYAAABjz9S4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XeYlNXd//H3mXvadlh6k14VkGoDUbFrRE3sicZoNBFbmmk+SZ5Uo0men8ZuNPZesQdRQUWkKCBIgKWXpS4sLLtT7/P7Y1fYZQd2YXfn3mE/r+uai9lzz9zz2cLs7HfO+R5jrUVEREREREREpDH5vA4gIiIiIiIiIoceFRxEREREREREpNGp4CAiIiIiIiIijU4FBxERERERERFpdCo4iIiIiIiIiEijU8FBRERERERERBqdCg4iIiIiIiIi0uhUcBARERERERGRRqeCg4iIiIiIiIg0Or/XAQDatm1re/To4XUMERERERERaQJz5szZYq1t53WOpnLaiTl2a0kyLY81Z370XWvt6Wl5sAZqFgWHHj16MHv2bK9jiIiIiIiISBMwxqzyOkNT2lqSZOa7h6XlsZxOS9um5YEagZZUiIiIiIiIiEijaxYzHEREREREREQylQVcXK9jNDua4SAiIiIiIiIijU4zHEREREREREQaxJK0muGwN81wEBEREREREZFGpxkOIiIiIiIiIg1Q2cPBeh2j2dEMBxERERERERFpdJrhICIiIiIiItJA2qWiNs1wEBEREREREZFGpxkOIiIiIiIiIg1gsSStejjsTTMcRERERERERKTRaYaDiIiIiIiISANpl4raNMNBRERERERERBqdCg4iIiIiIiIi0ui0pEJERERERESkASyQ1JKKWjTDQUREREREREQanWY4iIiIiIiIiDSQmkbWphkOIiIiIiIiItLoNMNBREREREREpAEskLSa4bC3Omc4GGO6GWM+MMZ8ZYxZaIy5qWq80Bgz2RiztOrf1tXu80tjTJExZrEx5rSm/ARERERERKR+ln65hlsvf4CJZ9zB439/i1g07nUkETmE1WeGQwL4ibX2c2NMHjDHGDMZ+C4wxVp7mzHmF8AvgJ8bYwYBFwOHA52B94wx/ay1yab5FEREREREpC7P3fsej97+5u6Ply9az6v/nsYT039DTn62h8lEDg2u1wGaoTpnOFhri621n1dd3wksAroAE4DHqm72GHBu1fUJwLPW2qi1dgVQBIxu7OAiIiIiIlI/0UiMx+54s9Z4RVmU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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x125673c88>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "param_1 = []\n",
    "param_2 = []\n",
    "costs = []\n",
    "\n",
    "for k,v in smac.runhistory.config_ids.items():\n",
    "    param_1.append(k._values['learning_rate'])\n",
    "    param_2.append(k._values['n_estimators'])\n",
    "    costs.append(smac.runhistory.cost_per_config[v])\n",
    "\n",
    "print(len(param_1), len(param_2), len(costs))\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import matplotlib.cm as cm\n",
    "\n",
    "plt.figure(figsize=(20,10))\n",
    "sc = plt.scatter(param_1, param_2, c=costs)\n",
    "\n",
    "plt.colorbar(sc)\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
